package com.agile.leetcode.easy.findErrorNums;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，导致集合 丢失了一个数字 并且 有一个数字重复 。
 * <p>
 * 给定一个数组 nums 代表了集合 S 发生错误后的结果。
 * <p>
 * 请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,2,2,4]
 * 输出：[2,3]
 * 示例 2：
 * <p>
 * 输入：nums = [1,1]
 * 输出：[1,2]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/set-mismatch
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @Author:ChenZhangKun
 * @Date: 2021/3/29 9:54
 */
public class FindErrorNums {
    public static void main(String[] args) {
        FindErrorNums errorNums = new FindErrorNums();
        int[] nums = {1, 2, 2, 4};
        System.out.println(Arrays.toString(errorNums.findErrorNums(nums)));
    }

    public int[] findErrorNums(int[] nums) {
        // 创建返回结果集
        int[] result = new int[2];
        // 拿到数组长度
        int length = nums.length;
        // 创建去重集合
        Set<Integer> set = new HashSet<>();
        // 定义重复数字
        int reNum = 0;
        // 遍历
        for (int num : nums) {
            if (set.contains(num)) {
                reNum = num;
            } else {
                set.add(num);
            }
        }
        result[0] = reNum;
        // 找缺失的数字
        int missNum = 0;
        for (int i = 1; i <= length; i++) {
            if (!set.contains(i)) {
                missNum = i;
                break;
            }
        }
        result[1] = missNum;
        return result;
    }
}
